package oop;
/*// 읽을떄()는 중요한것!
						
		ACT 1
		자바!
		자바는 미국의 SUN 마이크로시스템사에서 개발한 대표적인 객체 지향 프로그래밍 언어이다.
		(제임스 고슬링)이 oak라는 언어로 개발을 시작함
		1995년 5월 에 공식발표하여 (1996년 1월 JDK1.0을 발표함)
		(1998년 12월 sun , 자바 2 플랫폼 릴리스로업데이트)
		2004년 10월 j2se 5.0 -> 2006년 jdk6.0(자바의 오픈소스화시작)
		자바의특징
		1.플랫폼에 독립적인 언어이다. == 크로스플랫폼(당신이 만든 프로그램은 여러 프로그램에서 실행이 가능하다는 의미)
		2.보안이 강한 언어이다 (sand 박스 채용)
		플랫폼이란?
		일반적인 의미로 기간시설을 뜻함 = 인프라(infrasructure)
		플랫폼예시 ) "자동차가 있다면 그 자동차가 달릴수 있는 도로가 필요 여기서 도로에 해당하는것이 플랫폼"
		소프트웨어 응용프로그램을 돌리는데 쓰이는 하드웨어와 소프트웨어에 결합
		(자바언어의특징)은 jdk로 변경하지 않고 사용가능
		
		JDK(java development kit)의 종류
		JDK - 개발을 위한 api , 도큐먼트 ,컴파일러, 실행도구 및 배포 도구등을 포함함
		java SE - java se만을이용하면 데스크톱에서 실행할수 있는 애플리케이션 개발이 가능하다.
		java ee - 엔터프라이즈(기업용)웹 애플리케이션을 개발하기 위한 완벽한 APi를 제공함
		ACT 2
		자바의 기본 문법
		1. 프로그램 실행단계
		자바코드 작성후 확장자를 *.java로 저장해야함
		실행하기 위해선 class 파일java.exe파일을실행
		즉 인터프리터에의해서 바이트코드를 해당 플랫폼에서 실행할수 있도록 변환
		2.식별자
		식별자이름 규칙
		변수 : 소문자로 시작하는 명사로작성하지만 두단어가 합쳐질떄에는 두번쨰 단어의 첫 문자를 대문자로 작성한다.
		상수 : 모든 문자를 대문자로 작성함 단어가 합쳐질 경우에는 두단어 사이에 _문자를 사용
		자바의 모든 명령 문장의 마지막에는;을 입력해 주어야 한다.
		i)데이터타입 - 변수의 저장할 값의 종류에 따라 변수의 유형도 동일하기 정의
		/------------------------------------------------------------------------------------------/
		1. 기본형 데이터 타입
		byte(1) , short(2) , char(2) , int(4) , long(8) , float(4) , double(8) , boolean(8) 바이트형
		2의보수							기본			큰		실수			정수			참,거짓
		/------------------------------------------------------------------------------------------/
		2. 참조형 데이터 타입 - 클래스로 정의해서 사용하는 데이터 타입
		
		3. 연산자
		최우선 연산자  : .. , [] , ()
		단항 연산자 : ++ , -- , ! , ~, +/-
		산술연산자 : +,-,*,/,%
		
		반복문!
		while문 - 조건이 만족하는 동안 실행 문장을 반복해서 실행하는 반복문
		do-While문 - do문장먼저 실행하고 조건식을 비교 (따라서 조건식을 만족하지 않아도 한번은 실행된다!)
		
		ACT 4
		자바의 기본 문법 III
		변수 - 하나의 저장 영역에 하나의 이름으로 하나의 값만 저장
		배열 - 같은 타입의 데이터 여러개를 관련성 있게 하나의 이름으로 저장할때 유용
		ACT 5
		클래스 기본 - 변수와메소드 정의하기
		1.객체 생성
		stack영역에 생성된 객체의 레퍼런스 값이 변수 영역에 저장되고, heap영역에 각 변수가 생성되며 각 변수 값은 초기화 되지 않았으면 상단처럼
		해당 데이터타입의 기본값으로 설정된다.
		2. 메소드
		메소드에서 return의 용도는 메소드를 호출한 부분으로 특정 값을 반환해주는 용도로도 사용이 되지만, 
		메소드 수행을 강제로 종료하는 기능으로도 사용
		3. 메소드 오버로딩(다중정의) - 파라미터(메서드서명)이 달라야 함
		4. static 메소드와 인스턴스 메소드
		static 메소드 정의 부분 앞에 static 예약어가 지정된 메소드를 의미하고 
		인스턴스 메소드는 메소드 선언 부분 앞에 static이 지정되어 있지 않은 메소드를 의미함
		static 메소드는 객체를 생성하지 않아도 클래스 이름으로 바로 호출 가능
		static이 인스턴스 보다 초기화 시점(main메서드 호출되되는 시점)이 빠르다.
		/----------------------------------------------------------------------------------/
		5. 생성자
		생성자는 new 연산자에 의해서 객체를 생성할떄 단 한번 호출되는 메소드
		abc ab = new abc();
					 생성자
		/----------------------------------------------------------------------------------/
		
		클래스에 인자 있는 생성자가 하나라도 없으면 컴파일러가 자동으로 빈 생성자를 생성해 줌
		하지만 클래스에 인자 있는 생성자가 하나라도 있다면 빈 생성자를 자동으로 만들어 주지 않음,
		따라서 클래스의 인자 있는 생성자를 정의하였고, 빈생성자도 같이 생성하고 싶으면 반드시 빈 생성자도 정의해주어야함
		생성자를 정의하는 이유는 객체를 생성할떄 멤버변수의 값을 쉽게 초기화 하기 위해서이다.
		
		6.this()생성자
		this는 자기 자신 객체를 참조하는 래퍼런스 변수
		주로 생성자나 메소드에서 멤버 변수명이 로컬 변수명과 같은 경우 변수가 멤버변수임을 지정하기 위해 사용됨
		반면 this()는 자기 자신 클래스의 (다른 생성자)를 호출 하기 위해 사용되는 생성자
		this()를 쓰는 이유는 코드의 간결성을위해 사용
		
		생성자를 여러개 정의 해서 멤버변수를 초기화할떄 변수를 초기화 시키는 모든 생성자에서 정의하면 중복코드가 양산됨
		또한 this()생성자는 반드시 생성자의 첫줄 에서 실행되어야함
		ACT6
		클래스 고급 - 변수와 메소드 상속받아 정의 하기
		1.상속
		부모클래스를 자식 클래스가 상속받으면 자식 클래스에 부모 클래스에서 정의한 변수나 메소드가 상속된다.
		상속기능을 사용할떄는 extends 예약어를 사용
		/-----------------------------------------------------------------------------------/
		2.오버라이딩(override)
		부모로부터 상속받은 메소드를 자식 클래스에서 자기 자신 클래스의 기능에 적합하도록 재정의하는 기능
		오버라이딩이 성립할수 있는규칙
		1. 부모와 자식 클래스 사의에서 만 성립
		2. (static 메소드는 클래스에 속하는 메소드이기 떄문에 상속자체가 안됨)
		3. 접근 제한자가 private으로 정의된 메소드는 상속 자체가 되지 않음
		4. interface를 구현해서 메소드를 오버라이딩할떄는에는 반드시  접근제한자를public으로 정의해야함
		5. 메소드의 인자의 개수와 타입이 일치해야하고 ,리턴타입까지일치해야함
		6. 부모 클래스의 메소드의 접근 제한자보다 좁아질수 없다.
		7. 부모 클래스의 메소드보다 더많은 예외를 던질수 없음
		8. final 예약어가 지정된 메소드는 오버라이딩할수 없음
		/-----------------------------------------------------------------------------------/
		 
		 3. super와 super()
		 this는 자기 자신 객체를 가리키는 레퍼런스 변수
		 반면 super는 부모 객체를 가리키는 레퍼런스 변수이다
		 this()는 자기 자신클래스의 다른 생성자를 호출하는 역활을 하는 예약어라면 super() 부모 클래스의 생성자를 호출하는 역활
		 
		 다형성!
		 하나의 레퍼 랜스 변수가 여러타입의 객체를 참조할수 있는 방식으로 제공해준다.
		 다형성을 이용하면 부모 클래스 타입의 레퍼런스 변수로 자식 클래스 객체를 참조할수 있다.
		 자식 클래스 객체의 타입은 자동으로 부모 클래스 타입으로 변환된다 이것을 upcasting이라한다.
		 부모클래스를 자식클래스변수에 참조시키려면 명시적으로 자식 클래스 타입으로 캐스팅해주어야함 이것을 downcasting이라함
		 
		 인터페이스
		 메소드 명세를 정의 하는 단위
		 인터페이스에는 오로지 상수나 추상메소드(물체가없는 메소드)만 정의할수 있음.
		 인터페이스를 통해서도 다형성을 구현할수 있음 nvc패턴사용
		 ACT 8
		 예외 처리
		 프로그램이 비상적으로 종료되는 것을 원하지 않으므로 비정상적으로 종료되지 않게 하기 위해서 예외 처리를 해주어야 함
		 try(
		 예외가 발생할 만한 코드;
		 }
		 catch(예외 클래스 변수)
		 {
		 예외처리
		 }
		 1.여러개의 예외 처리
		 하나의 try 블록에 여러개의 catch 블록을 지정하여 예외 처리를 할수 있음
		 예외처리 문의 대표적인 종류
		 ArraylndexoutofBoundsException
		 NumberformatException
		 ArithmeticException
		
		2. 예외 종류
		자바에서 모든 클래스의 최상위 클래스는 Object클래스이다.
		예외 클래스 중 최상위 클래스는 Threwable클래스가 상속받는다.
		Error 클래스 : JAM이 갑자기 죽어벌니 경우등 개발자들이 전혀 손을 쓸수 없는 아주 치명적인 예외
		EXception 클래스 : 개발자들이 예외 처리를 해주어야하는 에러들
		RuntimeException : unChecked Exceptoon 실행시에만 에러가 발생하는 예외들
		프로그램 논리의 명확성을 위해서 예외 처리를 해주는 것이 효과적인 프로그램이 됨
		RuntimeException이 아닌 것은 개발자들의 문제라기 보다 사용자의 작업에 의해 발생하는 경우가 많음.
*/